package fr.generali.accueilclient.gwt.client.ui.components.form;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.editor.client.LeafValueEditor;

/**
 * ListBox paramétrée.<br>
 * Permet de toujours gardé la valeur objet associé à une ligne de la {@link com.google.gwt.user.client.ui.ListBox}.<br>
 * Pour se faire, on garde en local la liste des objets insérés.<br> 
 * @param <T>
 */
public class ListBox<T> extends com.google.gwt.user.client.ui.ListBox implements LeafValueEditor<T> {

    /** La liste des objets correspondants aux items de la {@link com.google.gwt.user.client.ui.ListBox} */
    private List<T> concreteValues = new ArrayList<T>();

    /**
     * L'insertion d'un item dans le composant se faire en passant le {@link String} à afficher, <br>
     * et l'objet associé. 
     * @param item
     * @param value
     */
    public void addItemValue(String item, T value) {
        addItem(item);
        concreteValues.add(value);
    }

    /**
     * @return l'objet correspondant à la ligne sélectionnée.<br>
     */
    public T getSelectedValue() {
        return concreteValues.get(getSelectedIndex());
    }

    /**
     * @return la liste des objets correspondants aux lignes sélectionnées.<br>
     */
    public List<T> getSelectedValues() {
        List<T> selectedValues = new ArrayList<T>();

		// TODO à revoir par BADR le 13/03/2012
		if (getItemCount() > 1) {
        for (int i = 1; i < getItemCount(); i++) {
            if (isItemSelected(i)){
                selectedValues.add(concreteValues.get(i));
            }
        }
		}
        return selectedValues;
    }

    /**
     * Permet de spécifier quelle ligne sélectionner à partir de sa valeur.<br>
     * @param selectedValue
     */
    public void setSelectedValue(T selectedValue) {
        if (selectedValue != null && concreteValues.contains(selectedValue)) {
            setSelectedIndex(concreteValues.indexOf(selectedValue));
        } else {
            if (hasValues()) {
                setSelectedIndex(0);
            }
        }
    }

    /**
     * @return <code>true</code> s'il existe au moins une ligne sélectionnée.<br>
     */
    private boolean hasValues() {
        return getItemCount() > 0;
    }

    @Override
    public void clear() {
        super.clear();
        concreteValues.clear();
    }
    
    @Override
    public void setValue(T value) {
        setSelectedValue(value);
    }

    @Override
    public T getValue() {
        return getSelectedValue();
    }

    public String getSelectedText() {
        return getItemText(getSelectedIndex());
    }
}